package com.jt.spring.demo1.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//当前类是工具API,目的获取代理对象
public class JDKProxy {

    /*
    * ClassLoader loader, 类加载器:将class加载到Java运行机制中
      Class<?>[] interfaces,被代理者的接口的数组  Java可以多实现
      InvocationHandler h ,将代理对象扩展的内容写到处理器中
      * */
    public static Object getProxy(Object target){
        //1,获取目标对象的类加载器
        ClassLoader loader=target.getClass().getClassLoader();
        //2,获取接口数组
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //3,获取处理器对象
        InvocationHandler h=getInvocationHandler(target);
        //创建代理对象
         return Proxy.newProxyInstance(loader, interfaces,h);

    }
    //获取InvocationHandler对象
    public static InvocationHandler getInvocationHandler(Object target){
        //当代理对象执行业务操作时,通过InvocationHandler进行业务的扩展
        return new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("事物开始");
                //调用 让目标方法执行 target"目标对象!!!其它都是固定写法
                Object result = method.invoke(target, args);
                System.out.println("事物提交");
                return result;
            }
        };
    }
}
